package com.cn.wanxi.io;

import com.cn.wanxi.dto.CompanyModelDto;
import com.cn.wanxi.model.CompanyModel;
import com.cn.wanxi.util.Common;

import javax.swing.plaf.IconUIResource;
import java.io.*;
import java.util.Arrays;

/**
 * 1.这里通过IO流将数据写入记事本，
 * 2.通过IO流将记事本中的数据读取出来
 * 3.将读取出来的数据进行封装到新的model
 * CompanyModelDto
 * 然后通过getCompanyModel设置页面需要的东西
 * <p>
 * 1.方法块：就是类加载之前执行
 * 2.构造方法：加载类之后执行
 * 方法块和构造方法，在创建对象的时候即执行
 */
public class CompanyModelIO {
    private String path = "D:\\step-three\\company.txt";

    /**
     * 无参的构造方法
     * 就是当类加载的时候去执行
     */
    public CompanyModelIO() {
        wirteNote();
    }

//    {
//        wirteNote();
//    }

    /**
     * 写入记事本
     */
    private void wirteNote() {

        /**
         * 1.写数据，需要用到IO流
         *  1.需要用到File类   就是去定义我们将数据保存到哪一个文件里面
         *  2.需要用到OutputStream流
         *  3.写，即将内存数据写入硬盘（记事本）wirte
         *  4.try catch 就是那里出异常，那里去解决，不要throws
         *  OutputStream输出流（字节流）
         */

        File file = new File(path);
        try {
            OutputStream outputStream = new FileOutputStream(file);//如果我们地址不存在，会进行自动创建
            CompanyModel companyModel = new CompanyModel();
            String phone = companyModel.getPhone();
            outputStream.write(phone.getBytes());//写入电话号码
            outputStream.write("@@".getBytes());
            String logo = companyModel.getLogo();
            outputStream.write(logo.getBytes());//写入logo
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getAd().getBytes());//写入广告
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getNet().getBytes());
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getEmail().getBytes());
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getLinePhone().getBytes());
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getAddress().getBytes());
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getVersion().getBytes());
            outputStream.write("@@".getBytes());
            outputStream.write(companyModel.getContent().getBytes());
            outputStream.write("@@".getBytes());
            outputStream.write(Arrays.toString(companyModel.lunboImgs).getBytes());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * static静态方法调用非静态方法两种情况
     * 1.将非静态方法改成静态方法
     * 2.在静态方法里面用对象.方法
     */
//    public static void main(String[] args) {
//
//        new CompanyModelIO().readStringNote();
//    }

//    /**
//     * 从记事本里面读取数据
//     * 从硬盘里面（记事本）读取数据叫写
//     * 写入内存
//     * InputStream输入流（字节流）
//     */
//    private void readNote() {
//
//        File file = new File(path);
//        try {
//            InputStream inputStream = new FileInputStream(file);
//            int result = 0;//
//            /**
//             * 现在每一次只能读取一个字节
//             * 如果想要全部去读出来，需要循环
//             * 思考？这里用什么循环？
//             * 如果不知道我们要循环多少次，就用while循环
//             * 如果真的有多少次循环，就用for
//             * read读取的时候，如果返回值为-1的情况下就表示以及读取完了，即跳出循环
//             * 注意：字母和数字都是一个字节可以用字节流，
//             * 字节流只能读取字母和数字.
//             * 字节流可以写入任何数据
//             * 中文是两个字节，用字节流读取就会出现乱码，所以需要用字符流
//             */
//            while ((result = inputStream.read()) != -1) {
//                System.out.print((char) result);
//            }
//
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//    }

//    /**
//     * 字符流,将所有数据全部读取出来
//     * 思考？怎么将数据进行保存到页面的model里面CompanyModelIO
//     */
//    private String readStringNote() {
//        StringBuilder stringBuilder = new StringBuilder();
//        try {
//            Reader reader = new FileReader(path);
//            /**
//             * 去读取数据的时候，我们不知道要读取多少次，所以需要用while循环
//             */
//            int result = 0;
//            //拼接字符串
//
//            /**
//             * String 和StringBuffer和StringBuilder的区别？
//             * 请问我aa创建了几个对象，bb创建了几个对象？
//             */
////            String aa="3";
////            String bb=new String("3");
//
//
//            while ((result = reader.read()) != -1) {
//
//                stringBuilder.append((char) result);
//            }
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return stringBuilder.toString();
//    }

    /**
     * 要得到公司信息之前，我们需要将数据先写入记事本
     * 或者说我们可以在创建我们这个对象的时候讲数据写入记事本
     * 1.就是直接将写入记事本的方法放在代码块里面
     * 2.就是将写入记事本的方法放入构造方法里面
     *
     * @return
     */
    public CompanyModelDto getCompanyModel() {

        /**
         * 1,写入公司信息到记事本--------通过构造函数来做的
         * 2.取得公司信息（从记事本里面取得）--通过我们readStringNote
         * 3.通过公司信息封装到CompanyModelDto---------getCompanyModel
         */
        String companyString = Common.readNote(path);
//        split字符串的分割成数组，就是通过@符号
        String[] strings = companyString.split("@@");
//        for (int i=0;i<strings.length;i++){}
//        for (String aa : strings) {
//            System.out.println("---------" + aa);
//        }
        CompanyModelDto companyModelDto = new CompanyModelDto();
        companyModelDto.setLogo(strings[1]);
        companyModelDto.setPhone(strings[0]);
        companyModelDto.setAd(strings[2]);
        companyModelDto.setAddress(strings[6]);
        companyModelDto.setContent(strings[8]);
        companyModelDto.setEmail(strings[4]);
        companyModelDto.setLinePhone(strings[5]);
        companyModelDto.setNet(strings[3]);
        companyModelDto.setVersion(strings[7]);
        String lunbo = strings[9];//得到我们轮播数组
        lunbo = lunbo.replace("[", "");//替换，第一个参数就旧值，第二个参数是新值
        lunbo = lunbo.replace("]", "");
        String[] lunbos = lunbo.split(",");
//        字符串方法
        companyModelDto.setLunboImgs(lunbos);
        return companyModelDto;
    }

}
